class PathMap extends Map {
  private pathMap: Map<string, string>;

  constructor() {
    super();
    this.pathMap = new Map();
  }
}

// ^ 定义一个 构造函数/类 的泛型
type ClassType<T> = new (...args: any[]) => T;

/**
 * - 单例模式
 * @param className 类名
 * @returns 代理
 */
const singleton = <T extends object>(className: ClassType<T>) => {
  // - 声明一个实例
  let instance: T | undefined;

  // - 创建一个代理
  const proxy = new Proxy(className, {
    // - 拦截构造函数
    // ? 在new一个新的实例时，都会访问到其construct，所以问懵拦截construct
    construct(target, argArray): T {
      // - 如果实例存在，则返回实例
      if (instance) {
        return instance;
      }
      // - 如果实例不存在，则创建一个实例并返回
      instance = Reflect.construct(target, argArray) as T;
      return instance;
    },
  });

  // - 将代理设置为构造函数
  // ? 为了避免在使用时通过其constructor访问到原型上的constructor，所以需要将代理设置为构造函数
  proxy.prototype.constructor = proxy;
  return proxy;
};

// - 创建一个单例实例
const ProxyPathMap = singleton<PathMap>(PathMap);

export const pathMapInstance = new ProxyPathMap();
